From 63e2f54516329cd54509e87e417905d73277eb9e Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Sat, 24 Oct 2009 12:25:29 +0200 Subject: [PATCH] Emit monitors-changed signal when appropriate --- gdk/quartz/gdkscreen-quartz.c | 25 ++++++++++++++++++++----- gdk/quartz/gdkscreen-quartz.h | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c index 68ca3776ce..ac2259049b 100644 --- a/gdk/quartz/gdkscreen-quartz.c +++ b/gdk/quartz/gdkscreen-quartz.c @@ -60,6 +60,8 @@ _gdk_screen_quartz_init (GdkScreenQuartz *screen_quartz) CGDisplayRegisterReconfigurationCallback (display_reconfiguration_callback, screen); + + screen_quartz->emit_monitors_changed = FALSE; } static void @@ -187,6 +189,12 @@ process_display_reconfiguration (GdkScreenQuartz *screen) if (width != gdk_screen_get_width (GDK_SCREEN (screen)) || height != gdk_screen_get_height (GDK_SCREEN (screen))) g_signal_emit_by_name (_gdk_screen, "size-changed"); + + if (screen->emit_monitors_changed) + { + g_signal_emit_by_name (screen, "monitors-changed"); + screen->emit_monitors_changed = FALSE; + } } static gboolean @@ -211,18 +219,25 @@ display_reconfiguration_callback (CGDirectDisplayID display, if (flags & kCGDisplayBeginConfigurationFlag) { /* Ignore the begin configuration signal. */ - - /* FIXME: We can most probably use this flag to properly - * emit monitors-changed. - */ return; } else { + /* We save information about the changes, so we can emit + * ::monitors-changed when appropriate. This signal must be + * emitted when the number, size of position of one of the + * monitors changes. + */ + if (flags & kCGDisplayMovedFlag + || flags & kCGDisplayAddFlag + || flags & kCGDisplayRemoveFlag + || flags & kCGDisplayEnabledFlag + || flags & kCGDisplayDisabledFlag) + screen->emit_monitors_changed = TRUE; + /* At this point Cocoa does not know about the new screen data * yet, so we delay our refresh into an idle handler. */ - if (!screen->screen_changed_id) screen->screen_changed_id = gdk_threads_add_idle (screen_changed_idle, screen); diff --git a/gdk/quartz/gdkscreen-quartz.h b/gdk/quartz/gdkscreen-quartz.h index a67401d03f..370e876984 100644 --- a/gdk/quartz/gdkscreen-quartz.h +++ b/gdk/quartz/gdkscreen-quartz.h @@ -47,6 +47,8 @@ struct _GdkScreenQuartz GdkRectangle *screen_rects; guint screen_changed_id; + + guint emit_monitors_changed : 1; }; struct _GdkScreenQuartzClass -- 2.30.2